{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "f2b8ca87",
   "metadata": {},
   "source": [
    "# 初识API、机器学习与人工智能"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "551b665f",
   "metadata": {},
   "source": [
    "> 在学习这门课前，我们要学习一下什么是API即API（接口）是什么？"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "404e5983",
   "metadata": {},
   "source": [
    ">eg.举个常见的例子，在京东上下单付款之后，商家选用顺丰发货，然后你就可以在京东上实时查看当前的物流信息。京东和顺丰作为两家独立的公司，为什么会在京东上实时看到顺丰的快递信息，这就要用到API，当查看自己的快递信息时，京东利用顺丰提供的API接口，可以实时调取信息呈现在自己的网站上。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "29694d33",
   "metadata": {},
   "source": [
    "* 而百度对于API给出这样的定义：\n",
    "- API（Application Programming Interface,应用程序编程接口）是一些预先定义的函数，目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力，而又无需访问源码，或理解内部工作机制的细节。     \n",
    "从百度定义中，我们先划下重点：<strong>函数、 提供应用程序与开发人员 、无需访问源码、例程 。</strong>注意这四个短语。其中，例程是某个系统对外提供的功能接口或服务的集合，本文着重说下API的数据服务功能接口。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4abde8ae",
   "metadata": {},
   "source": [
    "* 维基百科对于api的解释是:  \n",
    "应用程序接口 (Application Programming Interface 简称:API)为：“‘电脑操作系统（Operating system）’或‘程序库’提供给应用程序调用使用的代码”。其主要目的是让应用程序开发人员得以调用一组例程功能，而无须考虑其底层的源代码为何、或理解其内部工作机制的细节。API本身是抽象的，它仅定义了一个接口，而不涉及应用程序在实际实现过程中的具体操作。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bafca7ea",
   "metadata": {},
   "source": [
    "* 本课程着重说下API的数据服务功能接口。\n",
    "\n",
    ">首先，会先演示怎么通过浏览器，不需要编程、不需要访问源码，来调用免费的API接口，达到让你怎么使用最简单的接口；  \n",
    "\n",
    ">然后，会演示怎么通过编程去调用接口；  \n",
    "\n",
    ">最后，演示开启WEB服务，写一个简单的API接口，以体现出API的函数 (y=f(x)) 功能。  \n",
    "\n",
    ">你也可以复制代码试下。通过你自己的尝试，你会了解到些后端、前段的东西，并加深你对API的理解。那么我们就开始吧，先上一个图：以API提供信息（数据）的功能，看下数据是怎么流动的。如果给API一个具体的位置的话，就位于下图中央。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "126c5d39",
   "metadata": {},
   "source": [
    "# 接口分类\n",
    ">http接口、api接口、RPC接口、RMI、webservice、Restful等概念"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fb8f3f6a",
   "metadata": {},
   "source": [
    "* http接口:基于HTTP协议的开发接口.这个并不能排除没有使用其他的协议。  \n",
    "* api接口:API（Application Programming Interface）应用程序编程接口，应用也包括网络应用程序，就像api文档基本上就是使用说明书，API接口可以简单理解成“应用程序使用接口”。  \n",
    "* RPC接口：Remote Procedure Calls 远程过程调用 (RPC) 是一种协议，程序可使用这种协议向网络中的另一台计算机上的程序请求服务。由于使用 RPC 的程序不必了解支持通信的网络协议的情况，因此 RPC 提高了程序的互操作性。在 RPC 中，发出请求的程序是客户程序，而提供服务的程序是服务器。  RPC（远程过程调用）是一项广泛用于支持分布式应用程序（不同组件分布在不同计算机上的应用程序）的技术。RPC 的主要目的是为组件提供一种相互通信的方式，使这些组件之间能够相互发出请求并传递这些请求的结果。 没有语言限制。  \n",
    "* RMI：RMI（Remote Method Invocation，远程方法调用）RMI是针对于java语言的， RMI 允许您使用Java编写分布式对象  \n",
    "* Webservice接口：Webservice是系统对外的接口，比如你要从别的网站或服务器上获取资源或信息，别人肯定不会把数据库共享给你，他只能给你提供一个他们写好的方法来获取数据，你引用他提供的接口就能使用他写好的方法，从而达到数据共享的目的。  \n",
    "* RESTful ： 简称 REST,是描述了一个架构样式的网络系统，其核心是面向资源，REST专门针对网络应用设计和开发方式，以降低开发的复杂性，提高系统的可伸缩性。REST提出设计概念和准则为：  \n",
    ">1.网络上的所有事物都可以被抽象为资源(resource)  \n",
    ">2.每一个资源都有唯一的资源标识(resource identifier)，对资源的操作不会改变这些标识  \n",
    ">3.所有的操作都是无状态的  \n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "dc769b6e",
   "metadata": {},
   "source": [
    "***关于RPC和RMI的区别，各类博客有很多。Webservice和RESTful ，我不知道你说的是那个（Webservice这个是个大类，包括RESTful ）你可以看看 SOAP Webservice和RESTful Webservice 的区别。不要刻意去混淆找区别，有些是从不同角度、层次而言。也有可能同一个东西兼顾（不同层次、角度的兼顾）。***\n",
    "\n",
    ">http和webservice接口区别  \n",
    ">httpservice通过post和get得到你想要的东西  \n",
    ">webservice就是使用soap协议得到你想要的东西，相比httpservice能处理些更加复杂的数据类型  \n",
    " \n",
    "*http协议传输的都是字符串了，webservice则是包装成了更复杂的对象。*\n",
    "*hessian类似于webservice，但是它采用的是二进制RPC协议（Binary），具有轻量、传输量小、平台无关的特点，特别适合于目前网络带宽比较小的手机网络应用项目。*\n",
    " \n",
    "*以hessan的java实现为例，它可以传输Map、List、以及自定义的各种数据接口；比http的纯字符串也方便的多，省却了解析http返回值的步骤。*"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7888a7d8",
   "metadata": {},
   "source": [
    "# 关于API的重要知识点\n",
    "\n",
    "## 有关API的10个最重要的术语\n",
    "\n",
    "1. (HTTP) Requests and Responses： HTTP请求和响应\n",
    "2. REST：以资源为中心设计的互联系统表达型式\n",
    "3. (HTTP) Methods：HTTP方法\n",
    "4. (API) Endpoints：API端点\n",
    "5. API documentation：API文档\n",
    "6. API calls：API调用\n",
    "7. (HTTP) Payloads：HTTP酬载\n",
    "8. (HTTP) Response codes：HTTP响应状态码\n",
    "9. (HTTP) Headers：HTTP首部\n",
    "10. Authentication：认证\n",
    "\n",
    "## HTTP请求和响应\n",
    "\n",
    "(HTTP) Requests and Responses (HTTP请求和响应)，指的是HTTP协议中，用于客户端和服务器端之间的通信。HTTP协议通过请求和响应的交换达成通信。\n",
    "\n",
    "- 请求访问资源的一端称为客户端 (client side)\n",
    "- 提供资源响应的一端称为服务器端 (server side)\n",
    "- 请求必定由客户端发出，而服务器端回复响应\n",
    "- HTTP 是不保存状态，即无状态（stateless）的协议\n",
    "- Web网页及API都使用HTTP协议\n",
    "- API使用HTTP请求和响应用例：\n",
    "  - 向Spotify API发送请求(Requests)，告诉Spotify我想要检索哪个专辑，使用某专辑ID请求歌曲列表\n",
    "  - Spotify响应(Responses)，以'JSON'语言的数据格式响应某专辑中的歌曲列表\n",
    "- API文档应明白交待，请求应该是什么，以及对映的响应中期待回传结果是什么。\n",
    "\n",
    "## REST：以资源为中心设计的互联系统表达型式\n",
    "\n",
    "REST （Representational State Transfer）是以资源为中心设计的互联系统架构表达型式。\n",
    "\n",
    "- RESTful API的基本特征是：基于资源（Resource-based）的表达型式（Representations）。资源常是名词，如 一个人，一个用户，一个pdf，一个地址等。 名词可以用各种表达型式。\n",
    "- 调用API获得的响应是在客户端和服务器之间传输的资源的表达型式。\n",
    "- JSON是REST API常用的资源表达型式语言。\n",
    "- RESTful架构的6个准则要件：\n",
    "  - 统一接口（通常使用HTTP及资源，HTTP动词作为操作行为：如GET，PUT，POST，DELETE）\n",
    "  - 无状态 - 每个请求都有足够的信息供服务器处理消息。\n",
    "  - 客户端-服务器架构：始终是客户端/服务器连接，而不是，举例来说，与数据库的直接连接。\n",
    "  - 可缓存 - 服务器响应必须是可缓存的。\n",
    "  - 分层系统\n",
    "  - 按需编码\n",
    "- 对产品经理来说，REST是一套准则，遵循这些准则的API才能叫做RESTful API\n",
    "- 一套准则意谓着一致性。这一致性让开发人员可以更轻松地使用多种不同的API。\n",
    "- 不需要学习API特定的方法，REST API都使用相同的HTTP方法：\n",
    "  - POST\n",
    "  - GET\n",
    "  - PUT\n",
    "  - PATCH\n",
    "  - DELETE\n",
    "- 由Roy Fielding 提出，用来描述互联系统架构。为什么称为 REST？Web 本质上由各种各样的资源组成，资源由 URI 唯一标识。浏览器（或者任何其它类似于浏览器的应用程序）将展示出该资源的一种表现方式，或者一种表现状态。如果用户在该页面中定向到指向其它资源的链接，则将访问该资源，并表现出它的状态。这意味着客户端应用程序随着每个资源表现状态的不同而发生状态转移，也即所谓 REST。\n",
    "  - REST 设计原则遵循 ROA（Resource-Oriented Architecture，面向资源的体系架构）。ROA 是一种把实际问题转换成 REST 式 Web 服务的方法，它使得 URI丶HTTP 和 XML 具有跟其他 Web 应用一样的工作方式。\n",
    "  - ROA遵循以下的步骤：\n",
    "    - 分析应用需求中的数据集。\n",
    "    - 映射数据集到 ROA 中的资源。\n",
    "    - 对于每一资源，命名它的 URI。\n",
    "    - 为每一资源设计其 Representations。\n",
    "    - 用 hypermedia links 表述资源间的联系。\n",
    "\n",
    "## (HTTP) Methods：HTTP方法\n",
    "\n",
    "使用API时，会使用称为HTTP方法的信息来请求信息。在REST下，名词是REST资源，动词则是HTTP标准的方法\n",
    "\n",
    "- 不需要学习API特定的方法，REST API都使用相同的HTTP方法：\n",
    "  - POST\n",
    "  - GET\n",
    "  - PUT\n",
    "  - PATCH\n",
    "  - DELETE\n",
    "- 最常用的HTTP方法是创建(create)，读取(read)，更新(update)和删除(delete)信息，这4常见方法的首字母缩略词为CRUD\n",
    "- 产品人员最常用的方法是POST和GET，它允许您创建或读取和检索信息。\n",
    "- GET很简单，被认为是所有方法中最安全的，因为它不会更新任何信息。\n",
    "- 以下是最常见的HTTP方法的摘要：\n",
    "  - GET\n",
    "    - 用于**读取/检索**资源\n",
    "    - 执行GET方法时，响应包含您请求的信息。\n",
    "    - GET请求仅用于读取数据而不是更改数据。这意味着它们被认为是安全的。\n",
    "  - POST\n",
    "    - 用于**创建**新资源。\n",
    "    - 例如，如果我们想使用Twilio API创建新的文本消息，我们将使用POST方法，因为这是您创建新资源的方式（资源是文本消息）。\n",
    "  - PUT\n",
    "    - 用于**更新/替换**资源。\n",
    "    - 例如，更新用户的电子邮件地址。\n",
    "  - DELETE\n",
    "    - 用于**删除**数据。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ef328d39",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.8"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
